# load required libraries
library(tidyverse)
library(langcog) # source: https://github.com/langcog/langcog-package
library(psych)
library(lme4)
# set theme for ggplots
theme_set(theme_bw())

Data preparation

d_all <- d_us_ad_pilot_22 %>% rownames_to_column("subid") %>%
  full_join(d_gh_ch_22 %>% rownames_to_column("subid")) %>%
  full_join(d_th_ad_22 %>% rownames_to_column("subid")) %>%
  full_join(d_th_ch_22 %>% rownames_to_column("subid")) %>%
  full_join(d_vt_ad_22 %>% rownames_to_column("subid")) %>%
  full_join(d_vt_ch_22 %>% rownames_to_column("subid")) %>%
  column_to_rownames("subid")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")

EFA

Pooling all participants from all sites together into a common factor structure.

Parallel analysis

How many factors to retain?

reten_all_PA <- fa.parallel(d_all, plot = F); reten_all_PA
Parallel analysis suggests that the number of factors =  4  and the number of components =  3 
Call: fa.parallel(x = d_all, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  3 

 Eigen Values of 
  Original factors Simulated data Original components simulated data
1             8.53           0.33                9.13           1.29
2             1.28           0.25                1.92           1.24
3             0.62           0.21                1.26           1.20
4             0.20           0.18                0.83           1.17
reten_all_par <- reten_all_PA$nfact

What are these factors?

efa_all_par <- fa(d_all, nfactors = reten_all_par, rotate = "oblimin",
                  scores = "tenBerge", impute = "median")
convergence not obtained in GPFoblq. 1000 iterations used.
heatmap_fun(efa_all_par) + 
  labs(title = "Parallel Analysis")
Joining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_par, target = "all") + 
  labs(title = "Parallel Analysis")
Ignoring unknown aesthetics: y

scoresplot_fun(efa_all_par, target = c("ghosts", "God", "children")) + 
  labs(title = "Parallel Analysis")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_par, target = c("ghosts", "God", "children")) + 
  labs(title = "Parallel Analysis")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"

|============================================                 | 73% ~1 s remaining     
|=============================================                | 75% ~1 s remaining     
|==============================================               | 76% ~1 s remaining     
|===============================================              | 77% ~1 s remaining     
|================================================             | 79% ~1 s remaining     
|=================================================            | 81% ~1 s remaining     
|==================================================           | 83% ~0 s remaining     
|===================================================          | 85% ~0 s remaining     
|====================================================         | 86% ~0 s remaining     
|=====================================================        | 88% ~0 s remaining     
|======================================================       | 89% ~0 s remaining     
|=======================================================      | 92% ~0 s remaining     
|========================================================     | 93% ~0 s remaining     
|=========================================================    | 94% ~0 s remaining     
|==========================================================   | 95% ~0 s remaining     
|===========================================================  | 97% ~0 s remaining     
|============================================================ | 99% ~0 s remaining     
Joining, by = c("factor", "capacity", "order")

Minimizing BIC

How many factors to retain?

reten_all_BIC <- VSS(d_all, plot = F); reten_all_BIC

Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.88  with  1  factors
VSS complexity 2 achieves a maximimum of 0.92  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  3  factors 
BIC achieves a minimum of  -645.05  with  3  factors
Sample Size adjusted BIC achieves a minimum of  -196.92  with  5  factors

Statistics by number of factors 
  vss1 vss2   map dof chisq     prob sqresid  fit RMSEA  BIC SABIC complex eChisq
1 0.88 0.00 0.018 209  1964 1.7e-282    11.0 0.88 0.096  539  1203     1.0   2336
2 0.56 0.92 0.011 188   899  4.0e-93     7.5 0.92 0.065 -383   214     1.5    696
3 0.43 0.82 0.011 168   501  9.0e-35     6.2 0.93 0.047 -645  -112     1.8    265
4 0.43 0.81 0.014 149   383  1.5e-22     5.7 0.94 0.042 -633  -160     1.9    184
5 0.40 0.73 0.018 131   280  6.9e-13     5.4 0.94 0.036 -613  -197     2.1    134
6 0.40 0.73 0.023 114   227  1.6e-09     5.1 0.95 0.033 -550  -188     2.2    103
7 0.40 0.68 0.027  98   182  5.7e-07     4.8 0.95 0.031 -486  -175     2.3     75
8 0.37 0.60 0.033  83   134  3.3e-04     4.5 0.95 0.026 -432  -168     2.5     52
   SRMR eCRMS eBIC
1 0.074 0.078  911
2 0.041 0.045 -586
3 0.025 0.029 -880
4 0.021 0.026 -832
5 0.018 0.024 -759
6 0.016 0.022 -674
7 0.013 0.020 -594
8 0.011 0.019 -514
reten_all_bic <- data.frame(reten_all_BIC$vss.stats %>% rownames_to_column("nfact") %>% top_n(-1, BIC))$nfact %>% as.numeric()

What are these factors?

efa_all_bic <- fa(d_all, nfactors = reten_all_bic, rotate = "oblimin",
                  scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_bic) + 
  labs(title = "Minimizing BIC")
Joining, by = "capacity"
Joining, by = "factor"

  # labs(title = "Figure 1: Shared conceptual structure")

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_bic, target = "all") + #, highlight = "supernatural") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1,
                                   color = c(rep("black", 8),
                                             rep("#984ea3", 2)),
                                   face = c(rep("plain", 8),
                                            rep("bold", 2)))) +
  scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8")) +
  labs(title = "Minimizing BIC")
Ignoring unknown aesthetics: yScale for 'fill' is already present. Adding another scale for 'fill', which will
replace the existing scale.

  # labs(title = "Figure 2: Factor scores")
scoresplot_fun(efa_all_bic, target = c("ghosts", "God", "children")) + 
  scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8")) +
  labs(title = "Minimizing BIC")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: yScale for 'fill' is already present. Adding another scale for 'fill', which will
replace the existing scale.

itemsplot_fun(efa_all_bic, target = c("ghosts", "God", "children")) + 
  labs(title = "Minimizing BIC")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"

|========================================                     | 67% ~1 s remaining     
|=========================================                    | 68% ~1 s remaining     
|==========================================                   | 70% ~1 s remaining     
|===========================================                  | 72% ~1 s remaining     
|============================================                 | 73% ~1 s remaining     
|=============================================                | 75% ~1 s remaining     
|==============================================               | 76% ~1 s remaining     
|===============================================              | 78% ~1 s remaining     
|================================================             | 80% ~1 s remaining     
|=================================================            | 81% ~1 s remaining     
|==================================================           | 83% ~1 s remaining     
|==================================================           | 84% ~1 s remaining     
|===================================================          | 85% ~0 s remaining     
|====================================================         | 87% ~0 s remaining     
|=====================================================        | 88% ~0 s remaining     
|======================================================       | 90% ~0 s remaining     
|========================================================     | 92% ~0 s remaining     
|=========================================================    | 94% ~0 s remaining     
|=========================================================    | 94% ~0 s remaining     
|==========================================================   | 96% ~0 s remaining     
|===========================================================  | 97% ~0 s remaining     
|============================================================ | 99% ~0 s remaining     
Joining, by = c("factor", "capacity", "order")

LS0tCnRpdGxlOiAiU1JDRCAyMDE5IFN5bXBvc2l1bTogUmVsaWdpb3VzICYgbWV0YXBoeXNpY2FsIGNvbmNlcHRzIChTcmluaXZhc2FuKSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC42NykKYGBgCgpgYGB7cn0KIyBsb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKSAjIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2xhbmdjb2cvbGFuZ2NvZy1wYWNrYWdlCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobG1lNCkKCiMgc2V0IHRoZW1lIGZvciBnZ3Bsb3RzCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0Kc291cmNlKCIuL3NjcmlwdHMvbWF4X2ZhY3RvcnNfZWZhLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9wbG90X2Z1bl9iZWV0bGVzLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9yZXRlbl9mdW4uUiIpCnNvdXJjZSgiLi9zY3JpcHRzL2NsZWFuX2Z1bi5SIikKYGBgCgojIERhdGEgcHJlcGFyYXRpb24KCmBgYHtyLCBpbmNsdWRlID0gRn0KcXVlc3Rpb25fa2V5IDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvVGVtcGxldG9uIEdyYW50L0RFVkVMT1BNRU5UQUwgVEFTS1MvYmVldGxlczpkaW1raWQ6ZmFjdG9ycy9kZXNpZ24vYmVldGxlcyBjYi5jc3YiKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgd2FybmluZyA9IEZBTFNFfQojIFVTIGFkdWx0cyBQSUxPVApkX3VzX2FkX3BpbG90X3JhdyA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9ERVZFTE9QTUVOVEFMIFRBU0tTL2JlZXRsZXM6ZGlta2lkOmZhY3RvcnMvYW5hbHlzaXMvX1VTIHBpbG90L2JlZXRsZXNfcGlsb3QyX3RpZHkuY3N2IikKZF91c19hZF9waWxvdF8yMiA8LSBkX3VzX2FkX3BpbG90X3JhdyAlPiUKICBmaWx0ZXIoc2NhbGUgPT0gImJlZXRsZXMiKSAlPiUKICBkaXN0aW5jdChzdWJpZCwgY2hhcmFjdGVyLCBxdWVzdGlvbiwgcmVzcG9uc2UpICU+JQogIGZpbHRlcighcXVlc3Rpb24gJWluJSBjKCJibGVlZCIsICJtaW5kIiwgInNvdWwiKSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gcmVjb2RlKHF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkX3N1YnRyYWN0IiA9ICJhZGQgYW5kIHN1YnRyYWN0IG51bWJlcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5ncnkiID0gImdldCBhbmdyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgImJsZWVkIiA9ICJibGVlZCB3aGVuIHRoZXkgdG91Y2ggc29tZXRoaW5nIHNoYXJwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImNob29zZSIgPSAiY2hvb3NlIHdoYXQgdG8gZG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlndXJlX291dCIgPSAiZmlndXJlIG91dCBob3cgdG8gZG8gdGhpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWx0eSIgPSAiZmVlbCBndWlsdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFwcHkiID0gImZlZWwgaGFwcHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhciIgPSAiaGVhciB0aGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaHVuZ3J5IiA9ICJnZXQgaHVuZ3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImh1cnRfZmVlbGluZ3MiID0gImdldCBodXJ0IGZlZWxpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvdmUiID0gImZlZWwgbG92ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIm1pbmQiID0gImhhdmUgbWluZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFpbiIgPSAiZmVlbCBwYWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInByYXkiID0gInByYXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3VkIiA9ICJmZWVsIHByb3VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbWVtYmVyIiA9ICJyZW1lbWJlciB0aGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2FkIiA9ICJmZWVsIHNhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2FyZWQiID0gImZlZWwgc2NhcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNlX2ZhciIgPSAic2Vuc2Ugd2hlbiB0aGluZ3MgYXJlIGZhciBhd2F5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNlX3RlbXAiID0gInNlbnNlIHRlbXBlcmF0dXJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaHkiID0gImZlZWwgc2h5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpY2siID0gImZlZWwgc2ljaywgbGlrZSB3aGVuIHlvdSBmZWVsIGxpa2UgeW91IG1pZ2h0IHZvbWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNtZWxsIiA9ICJzbWVsbCB0aGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjICJzb3VsIiA9ICJoYXZlIHNvdWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaW5rIiA9ICJ0aGluayBhYm91dCB0aGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidGlyZWQiID0gImZlZWwgdGlyZWQiKSkgJT4lCiAgc3ByZWFkKHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgc2VsZWN0KC1zdWJpZCkgJT4lCiAgbXV0YXRlKHN1YmlkID0gcGFzdGUoInVzX2FkIiwKICAgICAgICAgICAgICAgICAgICAgICAxMDAwMTooMTAwMDArbGVuZ3RoKGxldmVscyhmYWN0b3IoZF91c19hZF9waWxvdF9yYXckc3ViaWQpKSkpLAogICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQiLAogICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiXyIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikgJT4lCiAgc2VsZWN0KC1gYWRkIGFuZCBzdWJ0cmFjdCBudW1iZXJzYCwgLWNoYXJhY3RlcikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEYsIHdhcm5pbmcgPSBGQUxTRX0KIyMgVVMgYWR1bHRzOiBOT1QgWUVUIFJVTgojIyBVUyBjaGlsZHJlbjogTk9UIFlFVCBSVU4KCiMjIEdIIGFkdWx0czogTk9UIFlFVCBSVU4KIyMgR0ggY2hpbGRyZW4KZF9naF9jaF8yMiA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0Rlc2t0b3AvVEVNUC9URU1QX0dIQU5BL2JlZXRsZXNfZ2hhbmFfdGlkeV8yMDE3LTA3LTEyLmNzdiIpICU+JSBjbGVhbl9mdW4oa2V5ID0gcXVlc3Rpb25fa2V5LCBleF9hZGRzdWIgPSBULCBzaXRlID0gImdoIiwgYWdlID0gImNoIikKCmRfZ2hfY2hfZmFudGVfMjIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9EZXNrdG9wL1RFTVAvVEVNUF9HSEFOQV8yMDE4L2JlZXRsZXNfZ2hhbmFfZmFudGVfY2hpbGRyZW5fdGlkeV8yMDE4LTA3LTE5LmNzdiIpWy0xXSAlPiUgCiAgcmVuYW1lKHN1Ym51bSA9IHN1YmlkKSAlPiUgCiAgZmlsdGVyKGdyZXBsKCJmYW50ZSIsIHRvbG93ZXIobGFuZ3VhZ2VfaG9tZSkpIHwgZ3JlcGwoInR3aSIsIHRvbG93ZXIobGFuZ3VhZ2VfaG9tZSkpKSAlPiUKICBjbGVhbl9mdW4oa2V5ID0gcXVlc3Rpb25fa2V5LCBleF9hZGRzdWIgPSBULCBzaXRlID0gImdoIiwgYWdlID0gImNoIikKCiMjIENIIGFkdWx0czogTk9UIFlFVCBSVU4KIyMgQ0ggY2hpbGRyZW46IE5PVCBZRVQgUlVOCgojIyBUSCBhZHVsdHMKZF90aF9hZF8yMiA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0Rlc2t0b3AvVEVNUC9URU1QX1RIQUlMQU5EL2JlZXRsZXNfdGhhaWxhbmRfYWR1bHRzX3RpZHlfMjAxOC0wNS0wOS5jc3YiKSAlPiUgY2xlYW5fZnVuKGtleSA9IHF1ZXN0aW9uX2tleSwgZXhfYWRkc3ViID0gVCwgc2l0ZSA9ICJ0aCIsIGFnZSA9ICJhZCIpCiMjIFRIIGNoaWxkcmVuCmRfdGhfY2hfMjIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9EZXNrdG9wL1RFTVAvVEVNUF9USEFJTEFORC9iZWV0bGVzX3RoYWlsYW5kX2NoaWxkcmVuX3RpZHlfMjAxOC0wNS0wOS5jc3YiKSAlPiUgY2xlYW5fZnVuKGtleSA9IHF1ZXN0aW9uX2tleSwgZXhfYWRkc3ViID0gVCwgc2l0ZSA9ICJ0aCIsIGFnZSA9ICJjaCIpCgojIyBWVCBhZHVsdHMKZF92dF9hZF8yMiA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0Rlc2t0b3AvVEVNUC9URU1QX1ZBTlVBVFUvYmVldGxlc192YW51YXR1X2FkdWx0c190aWR5XzIwMTgtMDUtMDkuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAidnQiLCBhZ2UgPSAiYWQiKQojIyBWVCBjaGlsZHJlbgpkX3Z0X2NoXzIyIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfVkFOVUFUVS9iZWV0bGVzX3ZhbnVhdHVfY2hpbGRyZW5fdGlkeV8yMDE4LTA1LTA5LmNzdiIpICU+JSBjbGVhbl9mdW4oa2V5ID0gcXVlc3Rpb25fa2V5LCBleF9hZGRzdWIgPSBULCBzaXRlID0gInZ0IiwgYWdlID0gImNoIikKYGBgCgpgYGB7cn0KZF9hbGwgPC0gZF91c19hZF9waWxvdF8yMiAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGZ1bGxfam9pbihkX2doX2NoXzIyICU+JSByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQogIGZ1bGxfam9pbihkX3RoX2FkXzIyICU+JSByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQogIGZ1bGxfam9pbihkX3RoX2NoXzIyICU+JSByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQogIGZ1bGxfam9pbihkX3Z0X2FkXzIyICU+JSByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQogIGZ1bGxfam9pbihkX3Z0X2NoXzIyICU+JSByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKQpgYGAKCiMgRUZBCgpQb29saW5nIGFsbCBwYXJ0aWNpcGFudHMgZnJvbSBhbGwgc2l0ZXMgdG9nZXRoZXIgaW50byBhIGNvbW1vbiBmYWN0b3Igc3RydWN0dXJlLgoKIyMgUGFyYWxsZWwgYW5hbHlzaXMKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl9hbGxfUEEgPC0gZmEucGFyYWxsZWwoZF9hbGwsIHBsb3QgPSBGKTsgcmV0ZW5fYWxsX1BBCnJldGVuX2FsbF9wYXIgPC0gcmV0ZW5fYWxsX1BBJG5mYWN0CmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhX2FsbF9wYXIgPC0gZmEoZF9hbGwsIG5mYWN0b3JzID0gcmV0ZW5fYWxsX3Bhciwgcm90YXRlID0gIm9ibGltaW4iLAogICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDJ9CmhlYXRtYXBfZnVuKGVmYV9hbGxfcGFyKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldHM/CgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9wYXIsIHRhcmdldCA9ICJhbGwiKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMS41fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX3BhciwgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KaXRlbXNwbG90X2Z1bihlZmFfYWxsX3BhciwgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCgojIyBNaW5pbWl6aW5nIEJJQwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF9CSUMgPC0gVlNTKGRfYWxsLCBwbG90ID0gRik7IHJldGVuX2FsbF9CSUMKcmV0ZW5fYWxsX2JpYyA8LSBkYXRhLmZyYW1lKHJldGVuX2FsbF9CSUMkdnNzLnN0YXRzICU+JSByb3duYW1lc190b19jb2x1bW4oIm5mYWN0IikgJT4lIHRvcF9uKC0xLCBCSUMpKSRuZmFjdCAlPiUgYXMubnVtZXJpYygpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhX2FsbF9iaWMgPC0gZmEoZF9hbGwsIG5mYWN0b3JzID0gcmV0ZW5fYWxsX2JpYywgcm90YXRlID0gIm9ibGltaW4iLAogICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmhlYXRtYXBfZnVuKGVmYV9hbGxfYmljKSArIAogIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQogICMgbGFicyh0aXRsZSA9ICJGaWd1cmUgMTogU2hhcmVkIGNvbmNlcHR1YWwgc3RydWN0dXJlIikKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjh9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfYmljLCB0YXJnZXQgPSAiYWxsIikgKyAjLCBoaWdobGlnaHQgPSAic3VwZXJuYXR1cmFsIikgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGMocmVwKCJibGFjayIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIiM5ODRlYTMiLCAyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGMocmVwKCJwbGFpbiIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYm9sZCIsIDIpKSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZTQxYTFjIiwgIiM0ZGFmNGEiLCAiIzM3N2ViOCIpKSArCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCiAgIyBsYWJzKHRpdGxlID0gIkZpZ3VyZSAyOiBGYWN0b3Igc2NvcmVzIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMX0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9iaWMsIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZTQxYTFjIiwgIiM0ZGFmNGEiLCAiIzM3N2ViOCIpKSArCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfYmljLCB0YXJnZXQgPSBjKCJnaG9zdHMiLCAiR29kIiwgImNoaWxkcmVuIikpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKCg==